#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date    : 2023-11-08 14:00:05
# @Author  : Figo Young
'''
旋转PDF文件。
from pypdf import PdfWriter, PdfReader
pag=R'I:\ebook-copy\output_files\merged_book.pdf'
reader = PdfReader(pag)
reader.pagesp[0].rotate()
writer = PdfWriter()
writer.add_page(reader.pages[0])
writer.pages[0].rotate(90)
with open(pag, "wb") as fp:
    writer.write(fp)
给图像去噪
from PIL import Image,ImageFilter,ImageEnhance
from PIL import Image
path = R'G:\Business documents\PyExer\ebook-copy\output_files\00.png'
img = Image.open(path)
out1 = img.transpose(method=Image.ROTATE_90)# 图像旋转90度
out = out1.convert('L') # 转换为灰度图像
threshold = 240
binarized_image = out.point(lambda x: 0 if x < threshold else 255, '1')#二值化图像
denoised_image = binarized_image.filter(ImageFilter.MedianFilter(size=1))#@去除噪声
w,h = out.size
w = w//2
h = h//2
imgshow = Image.new('L',(3*w,h))
imgshow.paste(binarized_image,(0,0))
imgshow.paste(denoised_image,(w,0))
imgshow.paste(out1,(w*2,0))
imgshow.show()


'''

import os, sys
import time
from tkinter import messagebox
import pyautogui as pi
import pynput
from PIL import Image, ImageEnhance, ImageFilter, ImageGrab
from pypdf import PdfWriter, PdfReader
import numpy as np


class Check():
    @staticmethod
    def check_page(vl):
        if vl[0] == '':
            messagebox.showinfo('错误', '必须填页数')
            return
        # if vl[0] == '0':
        #     return False
        try:
            int(vl)
        except ValueError:
            return False
        else:
            # if int(vl) < 1:
            #     return False
            return True

    # 对比两张画像是否相同。
    @staticmethod
    def compare_pic(img1, img2):
        image1 = np.array(img1)  # 把画像数据转为数组。
        image2 = np.array(img2)  # 把画像数据转为数组。

        if (np.array_equal(image1, image2)):
            result = True
        else:
            result = False
        return result

# 获取鼠标点。
class GetPoint():
    m = 0

    def get_poit(self, mo):
        GetPoint.m = mo
        self.data = []
        self.no = 0
        # Collect events until released
        with pynput.mouse.Listener(on_click=self.on_click) as listener:  # 运行 监听鼠标事件。
            listener.join()
        return self.data

    def on_click(self, x, y, button, pressed):

        if pressed:
            self.data.append([x, y])
            self.no += 1
            if self.no == GetPoint.m:
                return False


# 把文件夹中的图片合并为PDF文件并打开
class MergePDF():
    # 创建文件夹，如有则删除文件夹内文件。

    def __init__(self):
        self.platsys = sys.platform
        self.folder_path = ''

        if self.platsys == 'win32':
            self.folder_path = os.environ['TEMP'] + '\\output_files'  # 如果是window系统。
        else:
            self.folder_path = os.environ['TEMP'] + '\\output_files'

    def screenshot_pic(self, page, poit, copoit):
        sx = poit[0][0]
        sy = poit[0][1]
        ex = poit[1][0]
        ey = poit[1][1]
        cx = copoit[0][0]
        cy = copoit[0][1]
        if ex < sx or ey < sy:
            messagebox.showinfo('位置错误', '鼠标要先点击图片的左上角')
            return

        # ex = ex - sx
        # ey = ey - sy
        comnum = 0
        gn = 0
        prev_image = None
        current_image = None
        while True:


            # if i < 10:
            #     pt = '0%s.png' % i  # 给文件名的1位数字前加0.
            # else:
            #     pt = '%s.png' % i
            pt = '%s.png' % comnum
            image_path = os.path.join(self.folder_path, pt)  # 当前文件路径

            if comnum == 0:
                pi.moveTo(cx, cy)  # 把鼠标移到页面目录
                pi.click(cx, cy)  # 鼠标左键点击页面目录使页面向下走
                time.sleep(0.3)
                current_image = ImageGrab.grab(bbox=(sx, sy, ex, ey))  # 按指定尺寸截屏
                current_image.save(image_path)  # 保存画像。
                comnum += 1

            else:
                if comnum == page:
                    break
                prev_image = current_image
                current_image = ImageGrab.grab(bbox=(sx, sy, ex, ey))  # 按指定尺寸截屏
                cp = Check.compare_pic(prev_image, current_image)  # 与前一张画像对比是否相同。
                if cp == False:  # 如果画像不同则保存。
                    current_image.save(image_path)  # 保存画像。
                    comnum += 1
                else:
                    gn += 1
                    if gn >= 2: # 如果相同的画像超过等于两张则退出循环
                        break

            time.sleep(0.1)  # 翻页速度
            pi.keyDown('down')  # 按向下键
            time.sleep(0.2)  # 翻页速度
            # time.sleep(0.3)
            # pi.press('enter') # 按Enter键向下。
            # pi.click(cx, cy)
        return comnum

    def creat_file(self):
        if os.path.exists(self.folder_path):  # 如果存在文件夹 ，删除文件夹中的内容。
            self.pf = os.path.join(self.folder_path, '*')
            for f in os.listdir(self.folder_path):
                self.pf = os.path.join(self.folder_path, f)
                try:
                    os.remove(self.pf)  # 删除文件。
                except PermissionError:
                    messagebox.showinfo('错误', '旧文件无法删除，可能文件被打开 。')
                    return False
        else:
            os.mkdir(self.folder_path)  # 创建文件夹
        return self.folder_path

    # 取行窗口中的PDF文件名，循环处理图像后再保存PDF文件，最后再合并PDF文件保存。
    def save_pic_to_pdf(self, fn):
        f = 0
        self.pic_list = []
        self.mergpdf_path = os.path.join(self.folder_path, ("%s.pdf" % fn))  # 文件路径
        self.file_list = os.listdir(self.folder_path)  # 创建文件夹中的文件列表。
        # self.pic_path = ''
        self.merg = PdfWriter()  # 创建Pdf文件的对象。

        # 把文件夹中的图片保存为一个个PDF文件。
        '''
        1、循环处理：1 》打开图片》2处理图片分别率 3》保存图像为PDF文件 4》关闭图像 
        '''
        if len(self.file_list) != 0:
            comppic = None

            for f in range(0, len(self.file_list)):
                pfn = str(f) + '.png'
                pdfn = str(f) + '.pdf'
                if pfn in self.file_list:
                    pic_path = os.path.join(self.folder_path, pfn)

                    pdf_path = os.path.join(self.folder_path, pdfn)
                    img = Image.open(pic_path)  # 读取图片
                    self.handle_image(img, pdf_path)  # 处理图像后保存为PDF文件。

        self.file_list = os.listdir(self.folder_path)  # 出找文件夹中的PDF文件数量。
        # 合并PDF文件。
        if len(self.file_list) != 0:
            for ff in range(0, f + 1):  # 如果上次保存的列表中有文件则合并
                pfn = str(ff) + '.pdf'
                if pfn in self.file_list:
                    self.merg.append(os.path.join(self.folder_path, pfn))
            self.merg.write(self.mergpdf_path)  # 合并PDF文件到指定路径。
            self.merg.close()  # 关闭PDF程序。
        self.file_list = os.listdir(self.folder_path)  # 出找文件夹中的PDF文件数量。
        # 删除除集合的PDF以外的多余文件。
        if len(self.file_list) != 0:
            for f in self.file_list:
                if fn not in f:
                    os.remove(os.path.join(self.folder_path, f))  # 删除指定的文件。
            try:
                os.startfile(self.mergpdf_path)  # 打开PDF文件。
            except OSError:
                messagebox.showinfo('错误', '打不开文件。')
                return


    # 处理图像，如果横向则旋转图像，加强分别率，保存为单个PDF文件。
    def handle_image(self, pic_file, pdf_path):

        # img = img.rotate(90)# 旋转图片
        w, y = pic_file.size
        if w > y:
            pic_file = pic_file.transpose(Image.ROTATE_90)  # 旋转图片，像数一起转。
        # img3 = img2.convert('L')  # 转换为灰度图像
        # img3.show()
        # threshold = val
        # binarized_image = img3.point(lambda x: 0 if x < threshold else 255, '1')  # 二值化图像
        # # binarized_image.show()
        # denoised_image = binarized_image.filter(ImageFilter.MedianFilter(size=1))  # @去除噪声

        pic_file = ImageEnhance.Contrast(pic_file)  # 导入图片加强模块
        pic_file = pic_file.enhance(3)  # 调节图片分别率。
        # pdf_pt = os.path.join(self.folder_path, (str(filename) + '.pdf'))  # 保存单个PDF文件的路径。
        pic_file.save(pdf_path, 'PDF')  # 保存图片为PDF文件。
        pic_file.close()  # 关闭图片。
